Self-Learned Algorithms - 02
This is my learning note about algorithms.
Reference
- 《小浩算法》) - 链表系列
 
19.删除链表倒数第N个节点
https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/
题解
- 哨兵节点的应用:一个附加在原链表最前面用来简化边界条件的附加节点,它的值域不存储任何东西,只是为了操作方便而引入。
 - 要求一次遍历?那么就不存在第一次遍历找到链表长度,然后第二次遍历找到该节点。
 
解法
- 双指针
 
1  | Node = ListNode(None)  | 
- 递归
 
1  | global i  | 
递归的好处在于无论删除哪一个节点都可以返回正确的节点。(那么除了利用global i是否还有其他方法可以处理递归的次数呢,比如直接处理n?)
(递归的内存消耗比双指针稍高)
21.合并两个有序链表
https://leetcode-cn.com/problems/merge-two-sorted-lists
题解
- 设置一个哨兵节点,然后指向两个剩余链表中较小的一个
 
解法
- 双指针
 
1  | pre = ListNode(None)  | 
- 递归法
 
1  | if l1 and l2:  | 
最后的return l1 or l2是防止l1为空、l2不为空时输出为空的情况发生。
备注:
在 Python 中,and和 or都有提前截至运算的功能。
and:如果and前面的表达式已经为False,那么and之后的表达式将被 跳过,返回左表达式结果or:如果or前面的表达式已经为True,那么or之后的表达式将被跳过,直接返回左表达式的结果
例子:[] and 7 等于 []
141.环形链表
https://leetcode-cn.com/problems/linked-list-cycle
题解
- 题目看起来很简单,但是中文版的描述也讲了很多无关紧要的东西,所以评论区才会出现各种奇奇怪怪的解法(?)
 
解法
- 哈希表:记录访问过的位置
 
1  | dic = {}  | 
- 列表:利用列表寻找是否存在重复的对象
 
1  | if not head:  | 
- 双指针:定义一个快指针和慢指针,每次快指针走2步,慢指针走1步,判断快指针是否与慢指针重逢。可以有效的减少空间复杂度和时间复杂度的匹配次数
 
1  | slow = fast = head  | 
- 奇奇怪怪的神仙解法(不能学习)
 
1  | # 把访问过的值都进行赋值,如果链表完全成环,则必会出现重复值  |